"""
教师端认证路由模块

处理教师用户的认证相关功能，包括：
1. 教师身份验证装饰器
2. 注册信息装饰器
3. 教师首页路由

该模块提供了两个重要的装饰器：
- teacher_login_required: 确保用户已登录且是教师身份
- add_registration: 自动添加用户的注册信息到路由函数
"""

from flask import Blueprint, render_template, redirect, url_for, flash, request
from flask_login import login_user, logout_user, login_required, current_user
from functools import wraps
from ..models.models import Teacher, Registration
from ..models.database import db
from .tea_utils import get_common_data

# 创建蓝图对象，设置URL前缀为/teacher
bp = Blueprint('teacher_auth', __name__, url_prefix='/teacher')

def teacher_login_required(f):
    """
    教师登录验证装饰器
    
    用于保护需要教师身份才能访问的路由。该装饰器会：
    1. 检查用户是否已登录
    2. 验证用户是否为教师身份
    3. 如果验证失败，重定向到登录页面
    
    Args:
        f (function): 需要装饰的路由函数
        
    Returns:
        function: 装饰后的函数，增加了教师身份验证
        
    Example:
        @bp.route('/teacher/dashboard')
        @teacher_login_required
        def dashboard():
            return '教师仪表板'
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            return redirect(url_for('auth.login'))
        if not isinstance(current_user, Teacher):
            return redirect(url_for('auth.login'))
        return f(*args, **kwargs)
    return decorated_function

def add_registration(f):
    """
    添加注册信息装饰器
    
    自动将用户的注册信息添加到路由函数的参数中。
    该装饰器会：
    1. 查询当前教师的注册信息
    2. 将注册信息作为参数传递给被装饰的函数
    
    Args:
        f (function): 需要装饰的路由函数
        
    Returns:
        function: 装饰后的函数，增加了registration参数
        
    Example:
        @bp.route('/teacher/profile')
        @teacher_login_required
        @add_registration
        def profile(registration):
            return render_template('profile.html', registration=registration)
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        registration = Registration.query.filter_by(
            user_type='teacher',
            user_id=str(current_user.teacher_id)
        ).first()
        return f(registration=registration, *args, **kwargs)
    return decorated_function

@bp.route('/')
@bp.route('/index')
@teacher_login_required
@add_registration
def index(registration):
    """
    教师首页路由
    
    处理教师首页的请求，需要：
    1. 教师身份验证（通过teacher_login_required装饰器）
    2. 注册信息（通过add_registration装饰器）
    3. 通用数据（通过get_common_data函数）
    
    Args:
        registration (Registration): 教师的注册信息
        
    Returns:
        str: 渲染后的教师首页HTML
        
    Note:
        该路由同时处理'/'和'/index'两个URL，都指向教师首页
    """
    return render_template('teacher/index.html', 
                         registration=registration,
                         **get_common_data()) 